﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
#include <list>
using namespace std;

//class Person
//{
//public:
//	Person(string name, int age, string address, string tel, string id)
//		:_name(name), _age(age), _address(address), _tel(tel), _id(id) {}
//
//	void identity()
//	{
//		cout << "void identity(): " << _name << endl;
//	}
//
//	void Print()
//	{
//		cout << "姓名: " << _name << endl;
//		cout << "年龄: " << _age << endl;
//		cout << "地址: " << _address << endl;
//		cout << "电话: " << _tel << endl;
//		cout << "身份证号: " << _id << endl;
//	}
//
//
//protected:
//	string _name;
//	string _address;
//	string _tel;
//
//	string getIdcard()
//	{
//		return _id;
//	}
//
//public:
//	int _age;
//
//private:
//	string _id;
//};
//
//class Student :public Person
//{
//public:
//	
//	Student(string name = "zs", int age = 18, string address = "北京", string tel = "4946", string id = " 100", string school = "fuda", string _id = "001", string major = "con", int score = 100)
//		:Person(name, age, address, tel, id), _school(school), _id(id), _major(major), _score(score) {
//	}
//
//	void study()
//	{
//		cout << "void study(): " << _name << endl;
//	}
//
//	void Print()
//	{
//		Person::Print();
//		cout << "学校: " << _school << endl;
//		cout << "学号: " << _id << endl;
//		cout << "专业: " << _major << endl;
//		cout << "成绩: " << _score << endl;
//	}
//
//	
//protected:
//	string _school;
//	string _id;
//	string _major;
//
//
//	int getScore()
//	{
//		return _score;
//	}
//
//private:
//	int _score;
//};
//
//class Teacher :public Person
//{
//public:
//	Teacher(string name, int age, string address, string tel, string id, string school, string tid, string title, int salary)
//		:Person(name, age, address, tel, id), _school(school), _id(tid), _title(title), _salary(salary) {
//	}
//
//	void teach()
//	{
//		cout << "void teach(): " << _name << endl;
//	}
//
//	void Print()
//	{
//		Person::Print();
//		cout << "学校: " << _school << endl;
//		cout << "工号: " << _id << endl;
//		cout << "职称: " << _title << endl;
//		cout << "工资: " << _salary << endl;
//	}
//
//	
//protected:
//	string _school;
//	string _id;
//	string _title;
//
//	int getSalary()
//	{
//		return _salary;
//	}
//
//private:
//	int _salary;
//};
//
//int main()
//{
//	
//	Student s("lisi", 20, "shanghai", "119", "654321", "fuda", "001", "computer", 100);
//	s.Print();
//	
//
//	return 0;
//}
//int main()
//{
//	Student sobj;
//	sobj.identity();
//	sobj.study();
//
//
//	// 赋值兼容转换,特殊处理
//	// 继承关系中，子类对象可以赋值给父类指针或引用
//	// 父类对象不可以赋值给子类指针或引用
//	// 子类对象可以赋值给父类对象(对象切割) 切片
//	Person* pp = &sobj; // 父类指针指向子类对象
//	Person& rp = sobj; // 父类引用指向子类对象
//	pp->identity();
//	rp.identity();
//	cout << rp._age << endl;
//	rp._age++;
//	cout << rp._age << endl;
//
//	Person pobj = sobj; // 调用父类的拷贝构造函数
//	pobj.identity();
//	//pobj.study(); // error
//	//cout << pobj._score << endl; // error
//	//cout << pobj.getScore() << endl; // error
//	//cout << pobj.getIdcard() << endl; // error
//	return 0;
//}

//int main()
//{
//	Student s("zhangsan", 18, "beijing", "110", 123456, "pku", "001", "computer", 100);
//	s.identity();
//	s.study();
//
//	Teacher t("lisi", 30, "beijing", "119", 654321, "pku", "002", "professor", 10000);
//	t.identity();
//	t.teach();
//
//	return 0;
//}

// 继承vector实现stack
namespace Inheritance_vector_stack
{
	template<class T>
	class stack :public std::vector<T>
	{
	public:
		void push (const T& value)
		{
			// 类模板继承类模板时，子类模板必须指定父类模板的参数
			// 需要指定内域 std::vector<T>::
			// 也可以使用 using 声明父类的成员 using std::vector<T>::push_back;
			// 也可以使用 typedef 给父类起别名 typedef std::vector<T> Base; Base::push_back(value);
			// 也可以使用 typename 给父类起别名 typename std::vector<T> Base; Base::push_back(value);
			std::vector<T>::push_back(value);
		}

		void pop ()
		{
			std::vector<T>::pop_back();
		}

		T& top ()
		{
			return std::vector<T>::back();
		}

		bool empty ()
		{
			return std::vector<T>::empty();
		}

		size_t size ()
		{
			return std::vector<T>::size();
		}

	private:
		//std::vector<T> _v; // 组合实现
	};
}
template<class Container>
void Printf(const Container& c)
{
	// const_iterator 可能是静态成员变量，也可能是内嵌类型(内部类, typedef)
	// 依赖于模板参数的嵌套类型必须使用 typename 关键字声明
	// auto it = c.begin(); 
	typename Container::const_iterator it = c.begin();
	for (; it != c.end(); ++it)
	{
		cout << *it << " ";
	}
	cout << endl;
}

//int main()
//{
//	vector<int> v1 = { 1,2,3,4,5 };
//	list<int> l1 = { 10,20,30,40,50 };
//	Printf(v1);
//	Printf(l1);
//
//	Inheritance_vector_stack::stack<int> s;
//	s.push(1);
//	s.push(2);
//	s.push(3);
//	while (!s.empty())
//	{
//		cout << s.top() << " ";
//		s.pop();
//	}
//	cout << endl;
//	return 0;
//}
//

//class Person
//{
//public:
//	Person()
//		: _name("") 
//	{
//		cout << "默认构造函数: Person()" << endl;
//	}
//
//	Person (string name, string idCardNumber)
//		:_name(name), _idCardNumber(idCardNumber)
//	{
//		cout << "构造函数: Person(string name)" << endl;
//	}
//
//	Person (const Person& p) 
//		:_name(p._name) 
//	{
//		cout << "拷贝构造函数: Person(const Person& p)" << endl;
//	}
//
//	Person& operator= (const Person& p)
//	{
//		cout << "运算符重载: Person& operator= (const Person& p)" << endl;
//		if (this != &p)
//		{
//			_name = p._name;
//			_idCardNumber = p._idCardNumber;
//		}
//		return *this;
//	}
//
//	~Person ()
//	{
//		cout << "~Person()" << endl;
//	}
//
//protected:
//	string _name;
//
//private:
//	string _idCardNumber; // 身份证号
//};
//
//class Student :public Person
//{
//public:
//	Student()
//		:Person(), _num(""), _address("")
//	{
//		cout << "默认构造函数: Student()" << endl;
//	}
//
//	Student(string name, string idCardNumber, string num, string address, string BankCardNumber)
//		:Person(name, idCardNumber), _num(num), _address(address), _BankCardNumber(BankCardNumber)
//	{
//		cout << "构造函数: Student(string name, string num, string address)" << endl;
//	}
//
//	Student(const Student& s)
//		:Person(s), _num(s._num), _address(s._address), _BankCardNumber(s._BankCardNumber)
//	{
//		cout << "拷贝构造函数: Student(const Student& s)" << endl;
//	}
//
//	Student& operator= (const Student& s)
//	{
//		if (this != &s)
//		{
//			Person::operator=(s); // 赋值父类部分
//			_num = s._num;
//			_address = s._address;
//			_BankCardNumber = s._BankCardNumber;
//		}
//		cout << "运算符重载: Student& operator= (const Student& s)" << endl;
//		return *this;
//	}
//
//	~Student()
//	{
//		cout << "~Student()" << endl;
//	}
//
//protected:
//	string _num;
//	string _address;
//
//private:
//	string _BankCardNumber;
//};
//
//int main()
//{
//	Student s1("zhangsan", "123456789012345678", "001", "beijing", "6222020202020202020");
//	cout << "------------------" << endl;
//	Student s2 = s1; // 调用拷贝构造函数
//	cout << "------------------" << endl;
//	Student s3; // 调用默认构造函数
//	cout << "------------------" << endl;
//	s3 = s1; // 调用赋值运算符重载函数
//	cout << "------------------" << endl;
//
//
//	return 0;
//}

// 实现一个不能被继承的类
//class Base1
//{
//public:
//	~Base1() {}
//
//	void func()
//	{
//		cout <<"Base::func()" << endl;
//	}
//protected:
//	int _a = 1;
//
//private:
//	// C++ 98 
//	Base1() {}
//};
//
//class Base2	final // C++ 11 之后
//{
//public:
//	Base2() {}
//	~Base2() {}
//
//	void func()
//	{
//		cout << "Base::func()" << endl;
//	}
//protected:
//	int _a = 1;
//
//private:
//};


// 友元关系不能继承，也就是说基类友元不能访问派⽣类私有和保护成员
//class GoodGay
//{
//	public:
//	GoodGay() {}
//	~GoodGay() {}
//	void visitBase(Base& b)
//	{
//		b._a = 1; // ok 保护成员
//		b._b = 2; // ok 私有成员
//		b._c = 3; // ok 私有成员
//	}
//};
//
//class Base
//{
//	friend void func(Base& b); // 友元函数
//	friend class GoodGay; // 友元类
//public:
//	Base() :_a(0), _b(0), _c(0) {}
//	~Base() {}
//protected:
//	int _a; // 保护成员
//private:
//	int _b; // 私有成员
//	int _c; // 私有成员
//};
//
//class Son :public Base
//{
//	public:
//	Son() {}
//	~Son() {}
//	void func1()
//	{
//		_a = 1; // ok 保护成员
//		//_b = 2; // error 私有成员
//		//_c = 3; // error 私有成员
//	}
//
//protected:
//
//};
//
//void func(Base& b)
//{
//	b._a = 1; // ok
//	b._b = 2; // ok
//	b._c = 3; // ok
//}

// 继承与静态成员
//class Base
//{
//public:
//	Base() { cout << "Base()" << endl; }
//	~Base() { cout << "~Base()" << endl; }
//	static void func()
//	{
//		cout << "Base::func()" << endl;
//	}
//protected:
//	int _b; // 保护成员变量
//	static int _a; // 静态成员变量
//private:
//	int _c; // 私有成员变量
//};
//
//int Base::_a = 1; // 静态成员变量初始化
//class Son :public Base
//{
//public:
//	Son() { cout << "Son()" << endl; }
//	~Son() { cout << "~Son()" << endl; }
//
//	static void func()
//	{
//		cout << "Son::func()" << endl;
//	}
//	void func1()
//	{
//		_a = 10; // ok 继承静态成员变量
//		_b = 20; // ok 继承保护成员变量
//
//	}
//
//protected:
//	int _c; // 保护成员变量
//};

